Topic Modeling

토픽 모델링(Topic modeling)
토픽 모델링은 레이블이 없는 텍스트 문서에 토픽을 할당하는 광범위한 분야이다.
ex) 대량의 뉴스 기사 데이터셋을 분류하는 작업-토픽 모델링은 이런 기사에 스포츠, 금융, 세계 뉴스, 정치 등
      카테고리 레이블을 할당한다. 비지도 학습의 클러스터링(군집)으로 볼 수 있다.
잠재 디리클레 할당(Latent Dirichlet Allocation, LDA)
LDA는 베이지안 추론(Bayesian inference)과 상당히 복잡한 수학을 요구한다.
LDA는 여러 문서에 걸쳐 자주 등장하는 단어의 그룹을 찾는 확률적 생성 모델이다.

각 문서를 여러 단어가 혼합된 것으로 가정하면, 토픽은 자주 등장하는 단어들로 나타낼 수 있다.

LDA의 입력은 BoW 모델이다. LDA는 입력을 받은 BoW 행렬을 두 개의 행렬로 분해한다.
문서-토픽 행렬
단어-토픽 행렬
위 두행렬을 곱해서 가장 작은 오차로 BoW 입력 행렬을 재구성할 수 있도록,
LDA가 BoW 행렬을 분해한다.

단, 토픽의 개수를 미리 지정해 주어야 한다.(LDA의 하이퍼파라미터로 수동으로 지정해 주어야 한다.)
import pandas as pd
df=pd.read_csv('/Users/csian/Desktop/CP/data_set/movie_data.csv', encoding='utf=8')
from sklearn.feature_extraction.text import CountVectorizer
count=CountVectorizer(stop_words='english', max_df=.1, max_features=5000)
X=count.fit_transform(df['review'].values)
여러 문서에서 자주 등장하는 단어를 10%로 제한했다.(max_df=.1)
또, 가장 자주 등장하는 단어 5,000개로 단어 수를 제한했다.(max_features=5000)
이는 데이터셋의 차원을 제한하여 LDA의 추론 성능을 향상시킨다.
from sklearn.decomposition import LatentDirichletAllocation
lda=LatentDirichletAllocation(n_components=10, random_state=123, learning_method='batch')
X_topics=lda.fit_transform(X)
learning_method=‘batch’를 설정했으므로 lda추정기가 한 번 박복할 때 가능한 모든 훈련 데이터(BoW)를 사용하여 학습된다.

사이킷런의 LDA 구현은 기댓값 최대화(Expectation-Maximization, EM) 알고리즘을 사용하여 반복적으로 파라미터 추정 값을
업데이트 한다.
LDA를 학습하고 선별한 열 개의 토픽
lda.components_.shape

(10, 5000)

n_top_words=5
feature_names=count.get_feature_names()
for topic_idx, topic in enumerate(lda.components_):
print(" %d:"%(topic_idx+1))
print(" ".join([feature_names[i] for i in topic.argsort()[:-n_top_words-1:-1]]))

토픽 1:

worst minutes script awful stupid

토픽 2:

family mother father children girl

토픽 3:

american dvd war music tv

토픽 4:

human audience art cinema feel

토픽 5:

police guy car dead murder

토픽 6:

horror house sex blood girl

토픽 7:

role performance comedy actor performances

토픽 8:

series episode war episodes season

토픽 9:

book version original effects fi

토픽 10:

action fight guy guys cool

토픽 6 공포 영화에 대한 리뷰
horror=X_topics[:, 5].argsort()[::-1]
for iter_idx, movie_idx in enumerate(horror[:3]):
print('\n #%d:'%(iter_idx+1))
print(df['review'][movie_idx][:300],'...')

공포 영화 #1:

Emilio Miraglia's first Giallo feature, The Night Evelyn Came Out of the Grave, was a great combination of Giallo and Gothic horror - and this second film is even better! We've got more of the Giallo side of the equation this time around, although Miraglia doesn't lose the Gothic horror stylings tha ...


공포 영화 #2:

House of Dracula works from the same basic premise as House of Frankenstein from the year before; namely that Universal's three most famous monsters; Dracula, Frankenstein's Monster and The Wolf Man are appearing in the movie together. Naturally, the film is rather messy therefore, but the fact that ...


공포 영화 #3:

Before I talk about the ending of this film I will talk about the plot. Some dude named Gerald breaks his engagement to Kitty and runs off to Craven Castle in Scotland. After several months Kitty and her aunt venture off to Scottland. Arriving at Craven Castle Kitty finds that Gerald has aged and he ...